var scriptProperties = PropertiesService.getScriptProperties();
const geminiApiKey = scriptProperties.getProperty('GEMINI_API_KEY');
const openAi_ApiKey = scriptProperties.getProperty('OPENAI_API_KEY');
const geminiModel = 'gemini-1.5-flash';  // 다른 버전의 Gemini 모델 필요시, 여기서 수정하세요.
const geminiEndpoint = `https://generativelanguage.googleapis.com/v1beta/models/${geminiModel}-latest:generateContent?key=${geminiApiKey}`;

/** 
ContetPrompt : 맥락, 상황을 작성합니다.(예: 채널 설명 등)
tontPrompt : 어조를 지정합니다. (예: 부드럽게, 유머스럽게 등)
instructionPrompt : 그 외 지시사항을 작성합니다. (예: 답글 마지막에는 '감사합니다!'로 끝낼 것 등)
**/

const contextPrompt = `* 나는 대한민국에서 직장인을 위해 엑셀 및 다양한 오피스 프로그램의 활용법을 알려주는 유튜브 채널을 운영하고 있어.
* 구독자가 작성한 댓글에 답변을 작성하는 작업에 도움이 필요해.`;
const tonePrompt = `* 답변은 친절하면서 간결하고, 명료하고, 전문성있게 작성해. 항상 전문성을 잃지 않도록 노력해.`;
const instructionPrompt = `* 마지막에는 "감사합니다! -오빠두봇드림✨"으로 마칠 것.
* 댓글 내용은 반복하지 말고, 답글만 작성할 것.
* 만약 댓글에 타임라인(예: 12:34)이 있으면 커리큘럼에 있는 타임라인을 참고해서 응원의 문장을 작성할 것.\n`;

//--------------------------------------------

function 프롬프트미리보기 () {
  generatePrompt('영상 제목','영상 설명','감사합니다!','별말씀을요!');
}

function YoutubeCommentAutoReply() {
  GetCommentsInSheet();
  generateReplies();
  postRepliesToComments();
}

function generateReplies() {
  var sheet = SpreadsheetApp.openById(sheetId).getActiveSheet();
  var dataRange = sheet.getDataRange();
  var data = dataRange.getValues();
  
  var headers = data[0];
  var idIndex = headers.indexOf("ID");
  var titleIndex = headers.indexOf("영상 제목");
  var descriptionIndex = headers.indexOf("영상 설명");
  var textIndex = headers.indexOf("댓글");
  var replyIndex = headers.indexOf("답글");
  var keywordIndex = headers.indexOf("초안");
  var nameIndex = headers.indexOf("닉네임");
  var statusIndex = headers.indexOf("확인");

  for (var i = data.length - 1; i >= 1; i--) {
    if (data[i][statusIndex] === '') {
      if (data[i][nameIndex] === yHandle) {
        sheet.getRange(i + 1, replyIndex + 1).setValue('-');
        sheet.getRange(i + 1, statusIndex + 1).setValue('X');
      } else {
        var commentId = data[i][idIndex];
        var youtubeTitle = data[i][titleIndex];
        var youtubeDescription = data[i][descriptionIndex];
        var comment = data[i][textIndex];
        var keyword = data[i][keywordIndex];
        
        sheet.getRange(i + 1, replyIndex + 1).setValue('✨ 답변 생성중...');
        SpreadsheetApp.flush();
        if (commentId.includes('.')) {
          var topLevelCommentId = commentId.split('.')[0];
          var previousComments = '';

          for (var j = 1; j < data.length - 1; j++) {
            var prevCommentId = data[j][idIndex];
            if (prevCommentId === topLevelCommentId || prevCommentId.startsWith(topLevelCommentId + '.')) {
              var prevComment = data[j][textIndex];
              var prevReply = data[j][replyIndex];
              previousComments += 'Comment: ' + prevComment + '\nReply: ' + prevReply + '\n\n';
            }
          }
          
          var prompt = generatePrompt(youtubeTitle, youtubeDescription, comment, keyword, previousComments);
          var reply = askGemini(prompt); // <- ChatGPT 사용 시, 이 부분을 askChatGPT로 변경하세요!
          sheet.getRange(i + 1, replyIndex + 1).setValue(reply);
        } else {
          var prompt = generatePrompt(youtubeTitle, youtubeDescription, comment, keyword);
          var reply = askGemini(prompt); // <- ChatGPT 사용 시, 이 부분을 askChatGPT로 변경하세요!
          sheet.getRange(i + 1, replyIndex + 1).setValue(reply);
        }
      }
    } else if (data[i][statusIndex] === 'O') {
      break;
    } else {
      sheet.getRange(i + 1, replyIndex + 1).setValue('-');
    }
    SpreadsheetApp.flush();
  }
}

function generatePrompt(youtubeTitle='', youtubeDescription='', comment='', keyword='', previousComments='') {
  var prompt = `###Context###\n${contextPrompt}\n\n`;
  prompt += `###Objective###\n* Information에 제공한 영상 제목과 설명을 참고하여, 댓글에 대한 답변을 작성해.\n`;
  
  if (keyword.length > 0) { 
    prompt += `* 답변은 초안을 참고하여 작성할 것.\n`;
  }

  prompt += '\n';
  prompt += `###Information###\n`;

  prompt += `* 영상 제목: ${youtubeTitle}\n* 영상 설명: ${youtubeDescription}\n`;
  
  if (previousComments) {
    prompt += `* 이전 댓글과 답변:\n${previousComments}\n`;
  }
  if (keyword.length > 0) {
    prompt += `* 댓글: ${comment}\n* 답변 초안: ${keyword}\n\n`;
  } else {
    prompt += `* 댓글: ${comment}\n\n`;
  }

  prompt += `###Tone###\n${tonePrompt}`;

  prompt += '\n\n';

  prompt += `###Intruction###\n` +
            `${instructionPrompt}`;
  
  Logger.log(prompt);
  return prompt;
}

/**
 * Gemini API를 사용하여 응답을 생성합니다.
 * @param {string} prompt - Gemini 모델에 전달할 프롬프트 텍스트
 * @param {number} temperature - 생성 텍스트의 무작위성을 제어하는 온도 값 (기본값: 1)
 * @return {string} Gemini 모델이 생성한 텍스트 응답
 * @customfunction
 */
function askGemini(prompt, temperature=1) {
  const payload = {
    "contents": [
      {
        "parts": [
          {
            "text": prompt
          }
        ]
      }
    ],
    "generationConfig": {
      "temperature": temperature,
    },
  };

  const options = { 
    'method' : 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload)
  };

  const response = UrlFetchApp.fetch(geminiEndpoint, options);
  const data = JSON.parse(response);
  const content = data["candidates"][0]["content"]["parts"][0]["text"];
  return content;
}

function askChatGPT(prompt) {
    var url = 'https://api.openai.com/v1/chat/completions';
    var options = {
      method: 'post',
      contentType: 'application/json',
      headers: {
        'Authorization': 'Bearer ' + openAi_ApiKey
      },
      payload: JSON.stringify({
        model: 'gpt-4o-mini', // Use the correct model name
        messages: [
          {role: 'system', content: '당신은 유튜브 채널에 남겨진 구독자 댓글에 대한 답변을 작성하는 대한민국 최고의 챗봇입니다.'},
          {role: 'user', content: prompt}
        ]
      }),
      muteHttpExceptions: true
    };

  var response = UrlFetchApp.fetch(url, options);
  if (response.getResponseCode() !== 200) {
    Logger.log('Error: ' + response.getContentText());
    throw new Error('Failed to fetch response from OpenAI API');
  }
  
  var json = response.getContentText();
  var reply = JSON.parse(json).choices[0].message.content.trim();
  
  return reply;
}


